/*************************************************************************************
 * Nombre del archivo: Cola_Prioridad.java
 * Universidad del Valle de Guatemala
 * Curso: Sistemas Operativos
 * @author martin
 *          Martín Guzmán 08041
 * Fecha: Febrero de 2010
 * Descripción:
*************************************************************************************/
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;

public class Cola_Prioridad extends Cola_Abstracta<Proceso>{

    public Cola_Prioridad(){}

    /***********************************************
     * Método: get
     * Uso: obtiene el elemento especificado
     * @return G con el elemento de la cola...
    ***********************************************/
    public Proceso get(int i){
        return this.lista.get(i);
    }

    /***********************************************
     * Método: add
     * Uso: agrega un nuevo elemento a la cola
     * @return void agrega al final de la cola
    ***********************************************/
    public void add(Proceso nuevo){
        //******************************************************************* TODO REVISAR LO DE PREEMPTIVE
        this.lista.add(nuevo);
        Proceso temp_primero = this.lista.getFirst();
        this.ultimo_entrante=nuevo;
        Collections.sort(this.lista, new Comparator<Proceso>() {
            public int compare(Proceso o1, Proceso o2) {
                Integer a1 = o1.prioridad;
                Integer a2 = o2.prioridad;
                return a2-a1;
            }
        });
        if(!this.preemptive && this.lista.size()!=1){
            this.lista.remove(temp_primero);
            this.lista.addFirst(temp_primero);
        }

        //agregar las cosas de la cola al proceso
        this.ultimo_entrante.setQuantum_restante(this.quantum);
        this.ultimo_entrante.setEstado(2);//para poner en estado ready
        this.ultimo_entrante.cola_en_la_que_esta=this.getNumero_cola();
        this.ultimo_entrante.io_waiting=false;
        //nuevo.cola_en_la_que_esta=this.numero_cola;
        //System.out.println(this.lista+" "+this.ultimo_entrante.cola_en_la_que_esta);
    }

    /***********************************************
     * Método: getLast_in
     * Uso: obtiene el último elemento que entró a la cola
     * @return G con el último objeto que entró a la cola
    ***********************************************/
    public Proceso getLast_in() {
        return this.ultimo_entrante;
    }

}
